#include "stdafx.h"
#include "CppUnitTest.h"
#include "DSInterfaceWrapper.h"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace UnitTest_ArrayStack
{		
	Logger g_logger;

	void testIntArrayStack();
	void testIntConcurrentArrayStack();
	void testArrayStack(NativeIntArrayStack* a_pNativeIntArrayStack);

	BEGIN_TEST_MODULE_ATTRIBUTE()
		TEST_MODULE_ATTRIBUTE(L"ModuleAttr", L"ModuleAttrValue")
	END_TEST_MODULE_ATTRIBUTE()
	TEST_MODULE_INITIALIZE(ArrayStackModuleInitialize)
	{
		g_logger.WriteMessage(_T("TEST_MODULE_INITIALIZE"));
	}
	TEST_MODULE_CLEANUP(ArrayStackModuleCleanup) 
	{
		g_logger.WriteMessage(_T("TEST_MODULE_CLEANUP"));
	}

	TEST_CLASS(TestArrayStackClass)
	{
		BEGIN_TEST_CLASS_ATTRIBUTE()
			TEST_CLASS_ATTRIBUTE(L"ClassAttr", L"ClassAttrValue")
		END_TEST_CLASS_ATTRIBUTE()
		TEST_CLASS_INITIALIZE(ArrayStackClassInitialize) {
			g_logger.WriteMessage(_T("TEST_CLASS_INITIALIZE"));
		}
		TEST_CLASS_CLEANUP(ArrayStackClassCleanup) {
			g_logger.WriteMessage(_T("TEST_CLASS_CLEANUP"));
		}
	public:
		BEGIN_TEST_METHOD_ATTRIBUTE(IntArrayStack)
			TEST_METHOD_ATTRIBUTE(L"MethodAttr", L"MethodAttrValue")
			TEST_OWNER(L"SMP")
			TEST_PRIORITY(1)
		END_TEST_METHOD_ATTRIBUTE()
		TEST_METHOD_INITIALIZE(StackMethodInitialize) 
		{
			g_logger.WriteMessage(_T("TEST_METHOD_INITIALIZE"));
		}
		TEST_METHOD_CLEANUP(StackMethodCleanUp) 
		{
			g_logger.WriteMessage(_T("TEST_METHOD_CLEANUP"));
		}

		TEST_METHOD(IntArrayStack)
		{
			testIntArrayStack();
		}

		TEST_METHOD(IntConcurrentArrayStack)
		{
			testIntConcurrentArrayStack();
		}

	};

	void testIntArrayStack() {
		NativeIntArrayStack intArrayStack(5, false);
		testArrayStack(&intArrayStack);
	}

	void testIntConcurrentArrayStack() {
		NativeIntArrayStack intArrayStack(5, true);
		testArrayStack(&intArrayStack);
	}

	void testArrayStack(NativeIntArrayStack* a_pNativeIntArrayStack) {
		int debugPoppedValue[5] = {5, 4, 3, 2, 1};

		for(int data = 1; data < 11; data++) {
			if(a_pNativeIntArrayStack->canPush()) {
				a_pNativeIntArrayStack->push(data);
			}
		}

		Assert::AreEqual(a_pNativeIntArrayStack->getDataCount(), 5);

		for(int index = 0; index < 10; index++) {
			if(a_pNativeIntArrayStack->canPop()) {
				int value = a_pNativeIntArrayStack->pop();
				Assert::AreEqual(value, debugPoppedValue[index]);
			}
		}

	}
}